package jvm.autoMemoryManagement;

import java.util.HashSet;
import java.util.Set;

/**
 * JDK6 VM Args: -XX:PermSize=20M -XX:MaxPermSize=20M
 * JDK8 VM Args: -XX:MaxMetaspaceSize=20M  -Xmx20M -Xms20M
 * @author msi
 * 运行时常量池OOM
 */
public class RuntimeConstantPoolOOM {
    public static void main(String[] args) {
        //使用Set保持着常量池引用，避免Full GC回收常量池行为
        Set<String> set=new HashSet<>();
        //在short范围内足以上6MB的PermSize产生OOM了
        int i=0;
        while(true){
            set.add(String.valueOf(i++).intern());
        }
    }
}

/**
 * 结果：
 *      在JDK6中会出现：java.lang.OutOfMemoryError: PermGen space 在JDK6中运行时常量池是属于方法区的
 *      在JDK8中由于在JDK7以后运行时常量池就已经被移动到java堆中了，所以设置元空间大小对其无效，可以通过设置 -Xms -Xmx 堆大小来测试
 *          java.lang.OutOfMemoryError: Java heap space. 可见在JDK7以后运行时常量池已经被移动到java堆中。
 */

